package de.fhin.mas.agents.searcher.behaviours;

import jade.domain.FIPANames;
import jade.domain.FIPAAgentManagement.FailureException;
import jade.domain.FIPAAgentManagement.NotUnderstoodException;
import jade.domain.FIPAAgentManagement.RefuseException;
import jade.lang.acl.ACLMessage;
import jade.proto.ContractNetResponder;
import de.fhin.mas.MASEvents;
import de.fhin.mas.agents.searcher.SearcherAgent;
import de.fhin.mas.util.MessageUtil;

/**
 * Dieses <tt>Behaviour</tt> behandelt einen eingehenden Wunsch des Navigators
 * zum Bewegen des Roboters ("movement_of_platform_necessary" CFP) gemäß dem
 * ContractNet Protokoll.
 * 
 * @author Thomas Schläfer
 */
public class MovementOfPlatformNecessaryContractNetResponder extends
		ContractNetResponder {

	/** Die eindeutige ID zur Serialisierung ueber das Netzwerk. */
	private static final long serialVersionUID = 4894049388262922731L;

	/**
	 * Erzeugt eine neue
	 * <tt>MovementOfPlatformNecessaryContractNetResponder<tt> Instanz
	 * 
	 * @param parentAgent
	 *            Der Sucher-Dummy-Agent, zu dem das Behaviour gehoeren soll.
	 */
	public MovementOfPlatformNecessaryContractNetResponder(
			SearcherAgent parentAgent) {

		super(parentAgent, MessageUtil.buildBasicCommunicationTemplate(
				FIPANames.InteractionProtocol.FIPA_CONTRACT_NET,
				MASEvents.MOVEMENT_OF_PLATFORM_NECESSARY.getName(),
				ACLMessage.CFP, null));
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected ACLMessage handleCfp(ACLMessage cfp) throws RefuseException,
			FailureException, NotUnderstoodException {

		/*
		 * Wir nehmen den Wunsch zum Bewegen der Plattform immer an -> mit
		 * PROPOSE antworten
		 */
		ACLMessage propose = cfp.createReply();
		propose.setPerformative(ACLMessage.PROPOSE);
		return propose;
	}

	/**
	 * Diese Methode behandelt ein eigehendes Accept-Proposal, setzt die
	 * Zielsuche fort, startet die Umgebungssuche neu und informiert den
	 * Auftraggeber.
	 */
	@Override
	protected ACLMessage handleAcceptProposal(ACLMessage cfp,
			ACLMessage propose, ACLMessage accept) throws FailureException {

		/*
		 * Bewegen der Plattform wurde bestätigt, Suchen starten /
		 * wiederaufnehmen
		 */
		SearcherAgent searcherAgent = (SearcherAgent) myAgent;

		/*
		 * TODO tsc: Nur falls Zielobjekt im Moment nicht vom Roboter
		 * transportiert wird
		 */
		searcherAgent.resumeTargetSearch();

		searcherAgent.startEnvironmentScan();

		/* Inform-Done zurücksenden */
		ACLMessage result = accept.createReply();
		result.setPerformative(ACLMessage.INFORM);
		return result;
	}

}
